from itertools import chain

from flask_allows import Permission
from pluggy import HookimplMarker

# 定义一个标记，用于标识 xfree 的插件实现点
impl = HookimplMarker("xfree")


@impl(hookwrapper=True, tryfirst=True)
def xfree_tpl_admin_settings_menu(user):
    """
    将从钩子函数返回的列表展平为单个可迭代对象，用于填充菜单。

    参数：
    user：当前用户对象。

    从 xfree.utils.requirements 模块导入 IsAdmin，但不显示循环依赖警告。
    """
    from xfree.utils.requirements import IsAdmin  # noqa: circular dependency
    # 定义一些菜单项
    results = [
        ("admin.overview", "Overview", "fa fa-tasks"),
        ("admin.unread_reports", "Reports", "fa fa-flag"),
        ("admin.users", "Users", "fa fa-user"),
    ]

    # 如果用户具有管理员权限
    if Permission(IsAdmin, identity=user):
        # 扩展菜单项列表
        results.extend(
            [
                ("admin.groups", "Groups", "fa fa-users"),
                ("admin.forums", "Forums", "fa fa-comments"),
                ("admin.settings", "Settings", "fa fa-cogs"),
                ("admin.plugins", "Plugins", "fa fa-puzzle-piece"),
            ]
        )

    # 获取钩子的结果
    outcome = yield
    # 将结果展平并强制设置结果
    outcome.force_result(chain(results, *outcome.get_result()))


@impl(hookwrapper=True, tryfirst=True)
def xfree_tpl_admin_settings_sidebar():
    """
    将从钩子函数返回的列表展平为单个可迭代对象，用于填充侧边栏菜单。
    """
    # 获取钩子的结果
    outcome = yield
    # 将结果展平并强制设置结果
    outcome.force_result(chain(*outcome.get_result()))